package com.imooc.o2o.util;


import net.coobird.thumbnailator.Thumbnails;
import net.coobird.thumbnailator.geometry.Positions;
import org.slf4j.Logger;
import org.slf4j.LoggerFactory;

import javax.imageio.ImageIO;
import java.io.File;
import java.io.IOException;
import java.io.InputStream;
import java.text.SimpleDateFormat;
import java.util.Date;
import java.util.Random;

/**
 * @author 徐老板
 * @date 2020/1/1   10:33
 */
public class ImageUtil {
    private static final Logger logger = LoggerFactory.getLogger(ImageUtil.class);
    private static String bathPath=Thread.currentThread().getContextClassLoader().getResource("").getPath();

    /**
     * 创建生成随机数文件名需要的工具类
     * @param thumbnailInputStream
     * @param targetAddr
     * @return
     */
    private static final SimpleDateFormat sDateFormate=new SimpleDateFormat("yyyyMMddHHmmss");
    private static final Random r=new Random();

    /**
     * 这个是用来处理上传的图片文件的
     * 上传的文件是以MultipartFile类来接收的 其实是一个类
     * 这个类有getInputSream方法其实是流对象的一个封装
     * 可以打开它的源码看到
     * @param thumbnailInputStream
     * @param targetAddr
     * @return
     */

    public static String generatethumbnailInputStream(InputStream thumbnailInputStream,String fileName, String targetAddr){

        String realName=getRandomFileName();
        String extention=getFileExtension(fileName);
        makeDirPath(targetAddr);
        String relativeAddr=targetAddr+realName+extention;
        logger.info("=====================文件的相对路径为=======================");
        logger.debug(relativeAddr);
        File dest=new File(PathUtil.getImgBasePath()+relativeAddr);
        logger.info("=====================文件的绝对路径为========================");
        logger.debug(dest.getPath());
        try {
            Thumbnails.of(thumbnailInputStream).size(200,200 )
                    .watermark(Positions.BOTTOM_RIGHT,
                            ImageIO.read(new File(bathPath+"/22.jpg")), 0.25f)
                            .outputQuality(0.8f)
                            .toFile(dest);
        } catch (IOException e) {
            e.printStackTrace();
        }

        return dest.getPath();
    }
    /**
     * 创建随机文件名
     * 当前年月日时分秒+五位随机数
     * @return
     */
    private static String getRandomFileName() {
        final int rannum = r.nextInt(89999) + 10000;
        String nowTimeStr=sDateFormate.format(new Date());
        return rannum+nowTimeStr;
    }


    /**
     * 获取输入文件流的拓展名
     * 以点号为标识符截取字符串
     * @param
     * @return
     */

    private static String getFileExtension(String  fileName) {
        return fileName.substring(fileName.lastIndexOf("."));
    }


    /**
     * 创建目标路径所涉及的目录
     * 实现功能 自动创建上面所涉及的文件夹
     * targetAddr目标文件夹的相对路径
     * 这里要根据这个相对路径获取这个目标文件夹的绝对路径
     * 举例说明：如果文件目录为 /home/work/xulaoban/xxx.jpg
     * 那么home work xulaoban 这三个文件夹都要自动创建
     * 这里用到的是递归创建
     * 这里其实实现起来很简单 用mkdirs即可 mkdir是创建一个文件夹的
     * 感觉这个功能实现起来有点麻烦
     * @param targetAddr
     */
    private static void makeDirPath(String targetAddr) {
        String realFileParentPath=PathUtil.getImgBasePath()+targetAddr;
        File dirPath=new File(realFileParentPath);
        if (!dirPath.exists()){
            dirPath.mkdirs();
        }
    }

    /**
     * 删除原图片的方法
     */
    public static void deleteFileOrPath(String storePath){
            File file = new File(PathUtil.getImgBasePath()+storePath);
        if (file.exists()) {
            if (file.isDirectory()){
                File[] files = file.listFiles();
                for (int i = 0; i < files.length; i++) {
                    files[i].delete();
                }
            }
            file.delete();
        }
    }

}
